<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script>
			/* 
			高阶函数
				- 如果一个函数的参数或返回值是函数，则这个函数就称为高阶函数。
				为什么要将函数作为参数传递?(回调函数有什么作用?)。
					- 将函数作为参数，意味着可以对另一个函数动态的传递代码。
			 */
			class Person {
				constructor(name, age) {
					this.name = name;
					this.age = age;
				}
			}
			const personArr = [new Person("孙悟空", 9), new Person("猪八戒", 20), new Person("唐僧", 10)];

			function filter(arr, cb) {
				const tempArr = []
				for (let i = 0; i < arr.length; i++) {
					if (cb(arr[i])) {
						tempArr.push(arr[i]);
					}
				}
				return tempArr;
			}

			// 我们这种定义回调函数的形式比较少见，通常回调函数都是匿名函数
			function fn(a) {
				return a.age < 18;
			}
			//ret = filter(personArr, fn);

			ret = filter(personArr, (a) => {
				return a.age > 18
			}) //只有一个参数，可以简写为：
			ret = filter(personArr, a => a.age > 18)

			//同样一个filter，也可以过滤其他元素，如过滤非奇数。
			const number = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
			ret = filter(number, a => a % 2 === 0) // [2, 4, 6, 8, 10]
			console.log("年龄小于18的是", ret);
		</script>
	</head>
	<body>
	</body>
</html>